/*
 【入门】数组存数
  题目描述
    今有 N 个数组，初始时，N 个数组均为空。
    共有 M 次操作，每次在第 X 个数组中加入数字 Y。
    问最终各数组中有多少数，并将它们排序输出。

    比如，输入如下数据：
          3 5
          1 3
          1 2
          1 1
          2 1
          3 1
      表示有 3 个数组，共有 5 次操作，分别为:
        向第 1 个数组存入 3，
        向第 1 个数组存入 2，
        向第 1 个数组存入 1，
        向第 2 个数组存入 1，
        向第 3 个数组存入 1。
      输出如下：
          3 1 2 3
          1 1
          1 1
        第 1 行表示：第 1 个数组中有 3 个数，排序结果为 1 2 3
        第 2 行表示：第 2 个数组中有 1 个数，排序结果为 1
        第 3 行表示：第 3 个数组中有 1 个数，排序结果为 1
  输入
    第一行两个整数 N、M（N ≤ 100000，M ≤ 300000）。
    接下来 M 行，每行两个整数 X、Y，含义见试题描述。（1 ≤ X ≤ N，Y ≤ 10^9）
  输出
    共 N 行，第 i 行第一个数 SUM，表示第 i 个数组数的个数，接下来 SUM 个数，为排序之后的数组。
  样例输入
    3 5
    1 3
    1 2
    1 1
    2 1
    3 1
  样例输出
    3 1 2 3
    1 1
    1 1
*/

#include <bits/stdc++.h>

using namespace std;

int main() {
    int n;
    int m;

    cin >> n;
    vector <int> a[n];

    cin >> m;
    for (int i = 0; i < m; i++) {
        int x, y;
        cin >> x >> y;
        a[(x-1)].push_back(y);
    }

    for (int i = 0; i < n; i++) {
        // 使用 sort() 函数对动态数组 a[i] 按从小到大的顺序进行排序
        sort(a[i].begin(), a[i].end());

        cout << a[i].size() << " ";

        // 方法一
        // 使用迭代器的方式 访问动态数组 a[i] 的每一个元素
        for (auto j = a[i].begin(); j != a[i].end(); j++) {
            cout << *j << " ";
        }
        cout << endl;

        // 方法二
        // 使用下标的方式 访问动态数组 a[i] 的每一个元素
        /*
        for (int k = 0; k < a[i].size(); k++) {
            cout << a[i][k] << " ";
        }
        cout << endl;
        */
    }

    return 0;
}